package cz.uhk.ppro.controllers.manager;

import java.util.List;
import java.util.Locale;

import javax.persistence.RollbackException;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;

import cz.uhk.ppro.entities.Dodavatel;
import cz.uhk.ppro.entities.KontaktniOsoba;
import cz.uhk.ppro.form.DodavatelForm;
import cz.uhk.ppro.form.KontaktniOsobaForm;
import cz.uhk.ppro.form.Login;
import cz.uhk.ppro.services.DodavatelDbService;
import cz.uhk.ppro.services.LoginChecker;
import cz.uhk.ppro.validator.DodavatelValidator;
import cz.uhk.ppro.validator.KontaktniOsobaValidator;

@Controller
@SessionAttributes({"kontakty", "dod", "idDod"})
public class ManagerDodavatelController {
	Login login;
	
	LoginChecker loginChecker;
	DodavatelDbService dodavatelService;
	DodavatelForm dodForm;
	KontaktniOsobaForm konForm;
	DodavatelValidator dodavatelValidator;
	KontaktniOsobaValidator kontaktniOsobaValidator;
	
	@Autowired
	public void setLoginChecker (LoginChecker loginChecker){
		this.loginChecker = loginChecker;
	}
	
	@Autowired
	public void setKontaktniOsobaValidator(KontaktniOsobaValidator koVal) {
		this.kontaktniOsobaValidator = koVal;
	}
	
	@Autowired
	public void setDodavatelValidator(DodavatelValidator dodVal) {
		this.dodavatelValidator = dodVal;
	}
	
	@ModelAttribute("login")
	public Login getLogin() {
		return new Login();
	}
	
	@ModelAttribute("dodForm")
	public DodavatelForm getDodForm() {
		return new DodavatelForm();
	}
	
	@ModelAttribute("konForm")
	public KontaktniOsobaForm getKonForm() {
		return new KontaktniOsobaForm();
	}
	
	@Autowired
	public void setDodavatelService (DodavatelDbService dodavatelService){
		this.dodavatelService = dodavatelService;
	}

	@RequestMapping("/managerDodavatele")
	public String dodavatele(Locale locale, ModelMap model, HttpSession session) {
		if (loginChecker.checkLogin(session, "Manager")){
			List<Dodavatel> dodavatele = dodavatelService.vypis();
			model.addAttribute("dodavatele", dodavatele);
			return "managerDodavatele";
		} else {
			return "accessDenied";
		}
	}
	
	@RequestMapping("/pridatDod")
	public String pridat(Locale locale, ModelMap model, HttpSession session,  @ModelAttribute("dodForm") DodavatelForm dodForm) {
		if (loginChecker.checkLogin(session, "Manager")){
			dodForm = new DodavatelForm();
			model.addAttribute("dodForm", dodForm);
			return "managerPridatDod";
		} else {
			return "accessDenied";
		}
	}
	
	@RequestMapping("/pridatDodAkce")
	public String pridatAkce(@ModelAttribute("dodForm") DodavatelForm dodForm, BindingResult result, Locale locale, ModelMap model, HttpSession session) {
		dodavatelValidator.validate(dodForm, result);
		if (result.hasErrors()) {
			 return "managerPridatDod";
		 } else {
		if (loginChecker.checkLogin(session, "Manager")){
			dodavatelService.pridejDodavatele(dodForm.getNazev(), dodForm.getMesto(), dodForm.getUlice(), dodForm.getCp(), dodForm.getPsc());
			return "redirect:/managerDodavatele";
		} else {
			return "accessDenied";
		}}
	}
	
	@RequestMapping("/upravDod")
	public String uprav(Locale locale, ModelMap model, HttpSession session, 
			@ModelAttribute("dodForm") DodavatelForm dodForm, int id) {	
		if (loginChecker.checkLogin(session, "Manager")){
			dodForm = new DodavatelForm();
			Dodavatel dod = dodavatelService.vratDodavatele(id);
			dodForm.setCp(dod.getCisloPopisne());
			dodForm.setId(id);
			dodForm.setMesto(dod.getMesto());
			dodForm.setNazev(dod.getNazevFirmy());
			dodForm.setPsc(dod.getUlice());
			dodForm.setUlice(dod.getUlice());
			model.addAttribute("dodForm", dodForm);
			return "managerUpravDod";
		} else {
			return "accessDenied";
		}
	}
	
	@RequestMapping("/upravDodAkce")
	public String upravAkce(@ModelAttribute("dodForm") DodavatelForm dodForm,
			BindingResult result, Locale locale, ModelMap model, HttpSession session, int id) {
		dodavatelValidator.validate(dodForm, result);
		if (result.hasErrors()) {
			 return "managerUpravDod";
		 } else {
		if (loginChecker.checkLogin(session, "Manager")){
			dodavatelService.upravDodavatele(dodavatelService.vratDodavatele(id), dodForm.getNazev(), dodForm.getMesto(), dodForm.getUlice(), dodForm.getCp(), dodForm.getPsc());
			return "redirect:/managerDodavatele";
		} else {
			return "accessDenied";
		}}
	}
	
	@RequestMapping("/kontaktyDod")
	public String kontakty(Locale locale, ModelMap model, HttpSession session, 
			@ModelAttribute("konForm") KontaktniOsobaForm konForm, int id) {
		if (loginChecker.checkLogin(session, "Manager")){
			konForm = new KontaktniOsobaForm();
			Dodavatel dod = dodavatelService.vratDodavatele(id);
			konForm.setIdDod(id);
			List<KontaktniOsoba> kontakty = (List<KontaktniOsoba>)dod.getKontaktniOsoby();
			model.addAttribute("dod", dod.getNazevFirmy());
			model.addAttribute("idDod", dod.getId());
			model.addAttribute("kontakty", kontakty);
			model.addAttribute("konForm", konForm);
			return "managerKontaktyDod";
		} else {
			return "accessDenied";
		}
	}
	
	@RequestMapping("/kontaktyDodPridat")
	public String pridatKontakt(@ModelAttribute("konForm") KontaktniOsobaForm konForm, BindingResult result,
			Locale locale, ModelMap model, HttpSession session) {
		kontaktniOsobaValidator.validate(konForm, result);
		if (result.hasErrors()) {
			 return "managerKontaktyDod";
		 } else {
		if (loginChecker.checkLogin(session, "Manager")){
			dodavatelService.pridejKontaktniOsobu(konForm.getTitul(), konForm.getJmeno(), konForm.getPrijmeni(), konForm.getTelefon(), konForm.getFax(), konForm.getEmail(), dodavatelService.vratDodavatele(konForm.getIdDod()));
			return "redirect:/kontaktyDod?id="+konForm.getIdDod();
		} else {
			return "accessDenied";
		}}
	}
	
	@RequestMapping("/kontaktyDodUpravit")
	public String upravitKontakt(Locale locale, ModelMap model, HttpSession session,
			@ModelAttribute("konForm") KontaktniOsobaForm konForm, int id, int idDod) {
		if (loginChecker.checkLogin(session, "Manager")){
			konForm = new KontaktniOsobaForm();
			Dodavatel dod = dodavatelService.vratDodavatele(idDod);
			KontaktniOsoba osoba = dodavatelService.vratKontaktniOsobu(id);
			konForm.setEmail(osoba.getEmail());
			konForm.setFax(osoba.getFax());
			konForm.setId(id);
			konForm.setIdDod(idDod);
			konForm.setJmeno(osoba.getJmeno());
			konForm.setPrijmeni(osoba.getPrijmeni());
			konForm.setTelefon(osoba.getTelefon());
			konForm.setTitul(osoba.getTitul());
			List<KontaktniOsoba> kontakty = (List<KontaktniOsoba>)dod.getKontaktniOsoby();
			model.addAttribute("dod", dod.getNazevFirmy());
			model.addAttribute("idDod", dod.getId());
			model.addAttribute("kontakty", kontakty);
			model.addAttribute("konForm", konForm);
			return "managerKontaktyDodUpravit";
		} else {
			return "accessDenied";
		}
	}
	
	@RequestMapping("/kontaktyDodUpravitAkce")
	public String upravitKontaktAkce(@ModelAttribute("konForm") KontaktniOsobaForm konForm, BindingResult result,
			Locale locale, ModelMap model, HttpSession session) {
		kontaktniOsobaValidator.validate(konForm, result);
		if (result.hasErrors()) {
			 return "managerKontaktyDodUpravit";
		 } else {
		if (loginChecker.checkLogin(session, "Manager")){
			dodavatelService.upravKontaktniOsobu(konForm.getId(), konForm.getTitul(), konForm.getJmeno(), konForm.getPrijmeni(), konForm.getTelefon(), konForm.getFax(), konForm.getEmail());
			return "redirect:/kontaktyDod?id="+konForm.getIdDod();
		} else {
			return "accessDenied";
		}}
	}
	
	@RequestMapping("/odstranKontakt")
	public String odstranitKontakt(Locale locale, ModelMap model, HttpSession session, int id, int idDod) {
		if (loginChecker.checkLogin(session, "Manager")){
			dodavatelService.smazKontaktniOsobu(id);
			return "redirect:/kontaktyDod?id="+idDod;
		} else {
			return "accessDenied";
		}
	}
	
	@RequestMapping("/odstranDod")
	public String odstranitDodavatele(Locale locale, ModelMap model, HttpSession session, int id) {
		if (loginChecker.checkLogin(session, "Manager")){
			try {
				dodavatelService.smazDodavatele(id);
			} catch (RollbackException e){
				e.printStackTrace();
			}
			return "redirect:/managerDodavatele";
		} else {
			return "accessDenied";
		}
	}

}
